package gob.osinerg.emergencia.dao;

import gob.osinerg.emergencia.bean.AccidenteGraveFinalTestigo;
import gob.osinerg.emergencia.bean.EmergenciaOperativaFinal;
import gob.osinerg.emergencia.bean.EmergenciaOperativaFinalAccionesCorrectivas;
import gob.osinerg.emergencia.bean.EmergenciaOperativaFinalCausas;
import gob.osinerg.emergencia.bean.EmergenciaOperativaFinalDetalle;
import gob.osinerg.emergencia.bean.EmergenciaOperativaFinalMedidasSeguridad;
import gob.osinerg.emergencia.bean.EmergenciaOperativaFinalTestigo;
import gob.osinerg.emergencia.bean.EmergenciaOperativaPreliminar;
import gob.osinerg.emergencia.bean.FormularioEmergenciaUnmay;

import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Restrictions;

public class EmergenciaOperativaFinalDAOImpl extends GenericDAOImpl implements EmergenciaOperativaFinalDAO{

	public void save(EmergenciaOperativaFinal bean, FormularioEmergenciaUnmay beanform) throws Exception {
		Session session = getSession();
		Transaction transaction = null;
		EmergenciaOperativaFinalTestigo testigo = null;
		EmergenciaOperativaFinalCausas causa = null;
		EmergenciaOperativaFinalMedidasSeguridad medida = null;
		EmergenciaOperativaFinalAccionesCorrectivas accion = null;
		EmergenciaOperativaFinalDetalle detalle = null;
		EmergenciaOperativaPreliminar eop=bean.getPreliminar();
		List lista= new ArrayList();
		try {
			transaction = session.beginTransaction();
			if(beanform.getId() == null){
				beanform.setId(getNextPK("FRM_EMR_UM_SEQ"));
				if(beanform.getNmroEmrgncia() == null){
					beanform.setNmroEmrgncia(bean.getPreliminar().getIdFormato());
				}
				if(beanform.getRegistroDgh() == null) {
					beanform.setRegistroDgh(bean.getRegistroDgh());
				}
			}
			
			if(bean.getFlagTemporal().equals("SI")){
				beanform.setFlagTemporal("SI");
			}else{
				beanform.setFlagTemporal("NO");
			}
			
			session.saveOrUpdate(beanform);
			bean.setIdFormularioEmergencia(beanform.getId());
			
			if(bean.getId() == null || bean.getId().intValue() == 0){
				bean.setId(getNextPK("EM_OP_FIN_SEQ"));
			}
			//if(bean.getPreliminar().getIdFormularioEmergencia()==null) {
			//}
			session.saveOrUpdate(bean);
			
			eop.setEstdo("FIN");
			session.saveOrUpdate(eop);
			
			if(bean.getListaTestigosAccidente()==null) {
				bean.setListaTestigosAccidente(new ArrayList());
			}else {
				for(int i=0;i < bean.getListaTestigosAccidente().size();i++){
					testigo = (EmergenciaOperativaFinalTestigo)bean.getListaTestigosAccidente().get(i);
					if(testigo.getId()==null){
						testigo.setId(getNextPK("FRMTO_N6_DTLLE_TSTGOS_SEQ"));
						testigo.setIdFormularioEmergencia(bean.getId());
					}
					session.saveOrUpdate(testigo);
				}
			}
			
			if(bean.getListaCausas()==null) {
				bean.setListaCausas(new ArrayList());
			}else {
				for(int i=0;i < bean.getListaCausas().size();i++){
					causa = (EmergenciaOperativaFinalCausas)bean.getListaCausas().get(i);
					if(causa.getId()==null) {
						detalle= new EmergenciaOperativaFinalDetalle();
						detalle.setDescripcion(causa.getDescripcion());
						detalle.setTipo("causas");
						lista.add(detalle);
					}
				}
			}
			
			if(bean.getListaMedidasSeguridad()==null) {
				bean.setListaMedidasSeguridad(new ArrayList());
			}else {
				for(int i=0;i < bean.getListaMedidasSeguridad().size();i++){
					medida = (EmergenciaOperativaFinalMedidasSeguridad)bean.getListaMedidasSeguridad().get(i);
					if(medida.getId()==null) {
						detalle= new EmergenciaOperativaFinalDetalle();
						detalle.setDescripcion(medida.getDescripcion());
						detalle.setTipo("medidas");
						lista.add(detalle);
					}
				}
			}
			
			if(bean.getListaAccionesCorrectivas()==null) {
				bean.setListaAccionesCorrectivas(new ArrayList());
			} else {
				for(int i=0;i < bean.getListaAccionesCorrectivas().size();i++){
					accion = (EmergenciaOperativaFinalAccionesCorrectivas)bean.getListaAccionesCorrectivas().get(i);
					if(accion.getId()==null) {
						detalle= new EmergenciaOperativaFinalDetalle();
						detalle.setDescripcion(accion.getDescripcion());
						detalle.setTipo("acciones");
						lista.add(detalle);
					}
				}
			}
			
			for(int i=0;i < lista.size();i++){
				detalle = (EmergenciaOperativaFinalDetalle)lista.get(i);
				if(detalle.getId()==null){
					detalle.setId(getNextPK("FRMTO_N6_DTLLE_CSAS_SEQ"));
					detalle.setIdFormularioEmergencia(bean.getId());
					session.saveOrUpdate(detalle);
				}
			}
			
			transaction.commit();
		} catch (Exception e) {
			transaction.rollback();
			throw e;
		}finally{
			session.close();
		}
	}

    public Long getNextPK(String sequence) throws Exception {
        long result = 1;

        StringBuffer sql = new StringBuffer("");
        sql.append("SELECT ");
        sql.append(sequence);
        sql.append(".NEXTVAL AS ID FROM DUAL");        
        
        PreparedStatement pstmt = null;
        ResultSet rs = null;
        try {
            pstmt = getSession().connection().prepareStatement(sql.toString());
            rs = pstmt.executeQuery();
            if(rs.next()) {
                result = rs.getLong(1);
            }
            pstmt.close();
            pstmt = null;
            rs.close();
            rs = null;
        }
        catch(Exception e) {
            log.error(e.getMessage());
            if(pstmt != null) {
                try {pstmt.close();} catch(Exception ignore) {}
            }
            if(rs != null) {
            	try {rs.close();}catch(Exception ignore) {}
            }
        }
        return new Long(result);
    }
	public List findFormEmergenciaUnmay(String usrioCrdor, Long frmlarioId) throws Exception {			
		Criteria criteria = getSession().createCriteria(FormularioEmergenciaUnmay.class);
			criteria.add(Restrictions.eq("usrioCrdor",usrioCrdor));
			criteria.add(Restrictions.eq("frmlarioId",frmlarioId));
		criteria.addOrder(Order.asc("nmroEmrgncia"));
		
		return criteria.list();
	}
	public FormularioEmergenciaUnmay findFormularioEmergenciaUnMay(Long id) throws Exception {
		Criteria criteria = getSession().createCriteria(FormularioEmergenciaUnmay.class);
		criteria.add(Restrictions.eq("id",id));
		return (FormularioEmergenciaUnmay)criteria.uniqueResult();
	}
	
	public EmergenciaOperativaPreliminar findEmergenciaPreliminar(Long id) throws Exception {			
		Criteria criteria = getSession().createCriteria(EmergenciaOperativaPreliminar.class);
		criteria.add(Restrictions.eq("id",id));
		
		return (EmergenciaOperativaPreliminar)criteria.uniqueResult();
	}
	public List findEmergenciaOperativaPreliminar(String usrioCrdor, Long frmlarioId) throws Exception {			
		
		 String hql = " select eo from " +
		 			  " EmergenciaOperativaPreliminar eo, " +
		 			  " FormularioEmergenciaUnmay f  " +
		 			  " where " +
		 			  " eo.idFormularioEmergencia = f.id and " +
		 			  " eo.estdo = 'PRE' and " +
		 			  " f.usrioCrdor = '"+usrioCrdor+"' and " +
		 			  " f.frmlarioId = "+frmlarioId+" " ;

		 Query query = getSession().createQuery(hql);
		
		return query.list();
	}
	public EmergenciaOperativaFinal findEmergenciaFinal(Long id) throws Exception {
		EmergenciaOperativaFinal ef = null;
		EmergenciaOperativaPreliminar preliminar = null;
		
		Criteria criteria = getSession().createCriteria(EmergenciaOperativaFinal.class);
		criteria.add(Restrictions.eq("id",id));
		ef = (EmergenciaOperativaFinal)criteria.uniqueResult();
		
		/*Criteria criteriaPre = getSession().createCriteria(EmergenciaOperativaPreliminar.class);
		criteriaPre.add(Restrictions.eq("id",id));
		preliminar = (EmergenciaOperativaPreliminar)criteriaPre.uniqueResult();*/
		preliminar = findEmergenciaPreliminar(ef.getPreliminar().getId());
		ef.setPreliminar(preliminar);
		
		Criteria criteriaTestigos = getSession().createCriteria(EmergenciaOperativaFinalTestigo.class);
		criteriaTestigos.add(Restrictions.eq("idFormularioEmergencia",ef.getId()));
		List listaTestigos = criteriaTestigos.list();
		
		Criteria criteriaDetalles = getSession().createCriteria(EmergenciaOperativaFinalDetalle.class);
		criteriaDetalles.add(Restrictions.eq("idFormularioEmergencia",ef.getId()));
		List listaDetalles = criteriaDetalles.list();
		
		List listaCausas = new ArrayList();
		List listaMedidas = new ArrayList();
		List listaAcciones = new ArrayList();
		
		for(int i=0; i<listaDetalles.size();i++) {
			EmergenciaOperativaFinalDetalle detalle = new EmergenciaOperativaFinalDetalle();
			detalle = (EmergenciaOperativaFinalDetalle)listaDetalles.get(i);
			
			if(detalle.getTipo().equalsIgnoreCase("causas")) {
				EmergenciaOperativaFinalCausas c = new EmergenciaOperativaFinalCausas();
				c.setId(detalle.getId());
				c.setIdFormularioEmergencia(detalle.getIdFormularioEmergencia());
				c.setDescripcion(detalle.getDescripcion());
				listaCausas.add(c);
			}
			if(detalle.getTipo().equalsIgnoreCase("medidas")) {
				EmergenciaOperativaFinalMedidasSeguridad m = new EmergenciaOperativaFinalMedidasSeguridad();
				m.setId(detalle.getId());
				m.setIdFormularioEmergencia(detalle.getIdFormularioEmergencia());
				m.setDescripcion(detalle.getDescripcion());
				listaMedidas.add(m);
			}
			if(detalle.getTipo().equalsIgnoreCase("acciones")) {
				EmergenciaOperativaFinalAccionesCorrectivas a = new EmergenciaOperativaFinalAccionesCorrectivas();
				a.setId(detalle.getId());
				a.setIdFormularioEmergencia(detalle.getIdFormularioEmergencia());
				a.setDescripcion(detalle.getDescripcion());
				listaAcciones.add(a);
			}
		}
		
		if(ef!=null){
			if(listaTestigos!=null) ef.setListaTestigosAccidente(listaTestigos);
			if(!listaCausas.isEmpty()) ef.setListaCausas(listaCausas);
			if(!listaMedidas.isEmpty()) ef.setListaMedidasSeguridad(listaMedidas);
			if(!listaAcciones.isEmpty()) ef.setListaAccionesCorrectivas(listaAcciones);
		}
		
		return ef;
	}
	
	public List findEmergenciaOperativaFinal(String usrioCrdor, Long frmlarioId) throws Exception {			
		
		 String hql = " select eo from " +
		 			  " EmergenciaOperativaFinal eo " +
		 			  " where eo.flagTemporal = 'SI' ";

		 Query query = getSession().createQuery(hql);
		
		return query.list();
	}

	@Override
	public Long obtenerIdEmergenciaOperativaFinal(Long idFormulario)
			throws Exception {
		String hql = " select eo.idEmergenciaOperativa from " +
	 			  " EmergenciaOperativaFinal eo " +
	 			  " where eo.idEmergenciaOperativa = "+idFormulario;

		Query query = getSession().createQuery(hql);
	
	 	return Long.parseLong(query.uniqueResult().toString());
	}

} 